#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#define FILENAME "log.txt"

//int main()
//{
//    char buffer[1024];
//    // 从标准输入中读，读到的内容存放在buffer数组中,相当于scanf
//    ssize_t s = read(0, buffer, 1024);
//    if(s > 0)
//    {
//        buffer[s - 1] = 0;
//        //printf("echo# %s\n", buffer);
//        write(1, buffer, strlen(buffer));
//    }
//
//    return 0;
//}

// 输出重定向
//int main()
//{
//    close(1); // 文件描述符分配规则：寻找最小的，没有被使用的位置，分配给指定的文件。这里就会分配2号
//    int fd = open(FILENAME, O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    if(fd < 0)
//    {
//        perror("open fail:");
//        return 1;
//    }
//    printf("fd: %d\n", fd);        
//    printf("stdout->fd: %d\n", stdout->_fileno);
//    // 如果我们用C函数向显示器打印，显示器被关闭，C函数底层调用的是printf，它只认文件描述符，stdout里面封装有一个属性_fileno
//    // 虽然关闭了，但是还是向1号文件中打，这样就打印到log.txt文件中了
//    fprintf(stdout, "asfghj");
//    // 语言中提供的缓冲区
//    fflush(stdout);
//    
//    close(fd);
//    return 0;
//}

// 输入重定向
//int main()
//{
//    close(0);
//    int fd = open(FILENAME, O_RDONLY);
//    char buffer[1024];
//    fread(buffer, 1, sizeof(buffer), stdin); // stdin->_fileno: 0,现在的0是FILENAME(log.txt)
//    printf("buffer: %s\n", buffer);
//
//    close(fd);
//    return 0;
//}

// 上面的重定向是我们原理上理解后，自己操作实现的，下面我们来调用接口实现
// dup2，保留的是oldfd，newfd覆盖了oldfd
//int main()
//{
//    // 示例：输出重定向
//    //int fd = open(FILENAME, O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    //if(fd < 0)
//    //{
//    //    perror("open fail:");
//    //    return -1;
//    //}
//    //dup2(fd, 1);
//
//    //printf("hello printf\n");
//    //fprintf(stdout, "hello fprintf\n");
//
//    //close(fd);
//    
//    // 示例，输入重定向，以上面输出重定向为基础来做
//    int fd2 = open(FILENAME, O_RDONLY);
//    dup2(fd2, 0);
//
//    char buffer[1024];
//    fread(buffer, 1, 1024, stdin);
//    printf("buffer:%s\n", buffer);
//    
//    close(fd2);
//
//    return 0;
//}

int main()
{
    fprintf(stdout, "stdout\n");
    fprintf(stderr, "stderr\n");

    return 0;
}
